//
//  WBComposeTextView.swift
//  TYCWeiBo
//
//  Created by tangyunchuan on 2018/7/31.
//  Copyright © 2018年 中发. All rights reserved.
//

import UIKit

class WBComposeTextView: UITextView {

    //占位标签
    private lazy var placeholderLabel = UILabel()
    override func awakeFromNib() {
        setUpUI()
        
    }

    //移除通知
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    //MARK:监听方法
    @objc func textChanged() {
        //如果有文本，不显示占位标签，否则显示
        placeholderLabel.isHidden = self.hasText
    }
}

// MARK: - 微博表情键盘专属方法
extension WBComposeTextView {
    var emoticonText: String {
        //1.获取textView的属性文本
        guard let attrStr = attributedText else {
            return ""
        }
        //2.需要蝴蝶属性中文本中的图片（附件Attachment）
        /**
         1>遍历的范围
         2>选项[]
         3>闭包
         */
        var result = String()
        
        //        attrStr.enumerateAttributes(in: NSRange(location: 0, length: attrStr.length), options: []) { (dict, range, _) in
        //            if let attachment = dict["NSAttachment"] as? TYCEmoticonAttachment{
        //                result += attachment.chs ?? ""
        //            }else {
        //                let subStr = (attrStr.string as NSString).substring(with: range)
        //                result += subStr
        //            }
        //        }
        return result
    }
    
    
    func insertEmoticon(em: TYCEmoticon?) {
        //1.em == nil 是删除按钮
        guard let em = em else {
            //删除文本
            deleteBackward()
            return
        }
        //2.emoji 字符串
        if let emoji = em.emoji, let textRange = selectedTextRange {
            //UITextRange仅用在此处
            replace(textRange, withText: emoji)
            return
        }
        
        //代码执行到此，都是图片表情
        //0.获取表情中的图像属性文本
        //所有的排版系统中，几乎都有一个共同的特点，插入语的字符的显示，跟随前一个字符的属性，但是本身没有‘属性’
        let imageText = em.imageText(font: font!)
        //1> 获取当前textView属性文本=>可变的
        let attrStrM = NSMutableAttributedString(attributedString: attributedText)
        //2>将图像的属性文本插入到当前的光标位置
        attrStrM.replaceCharacters(in: selectedRange, with: imageText)
        //3>重新设置属性文本
        //记录光标位置
        let range = selectedRange
        //设置文本
        attributedText = attrStrM
        //恢复光标位置，length是选中字符的长度,插入文本之后，应该为0
        selectedRange = NSRange(location: range.location + 1, length: 0)
        
        //4>让代理执行文本变化方法 - 在需要的时候，通知代理执行协议方法
        delegate?.textViewDidChange?(self)
        //5>执行当前对象的文本变化方法
        textChanged()
    }
}
private extension WBComposeTextView {
    
    func setUpUI() {
       placeholderLabel.text = "分享新鲜事..."
        placeholderLabel.font = self.font
        placeholderLabel.frame.origin = CGPoint(x: 5, y: 8)
        addSubview(placeholderLabel)
        placeholderLabel.sizeToFit()
        //添加监听通知
        NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: NSNotification.Name.UITextViewTextDidChange, object: self)
        //测试代理
        //自己做自己的代理对象
//        self.delegate = self
    }
}
